const express = require('express');
const cors = require('cors');
const morgan = require('morgan');
const helmet = require('helmet');
const path = require('path');
const config = require('./config/config');

// 数据库配置
const { testConnection, syncDatabase } = require('./models');

// 错误处理中间件
const { errorHandler, notFoundHandler } = require('./middleware/errorMiddleware');

// 路由
const routes = require('./routes');

// 创建Express应用
const app = express();
const PORT = config.server.port;

// 中间件
app.use(helmet({ 
  // 允许跨域资源共享
  crossOriginResourcePolicy: { policy: "cross-origin" } 
})); // 安全头

// 配置CORS，允许所有来源（开发环境）
app.use(cors({
  origin: '*',
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
  allowedHeaders: ['Content-Type', 'Authorization']
}));

// 全局请求日志
app.use((req, res, next) => {
  // 移除调试日志输出
  next();
});

// 仅在开发环境使用详细日志
if (config.server.env === 'development') {
  app.use(morgan('dev')); // 开发环境详细日志
} else {
  app.use(morgan('combined', {
    skip: (req, res) => res.statusCode < 400 // 生产环境只记录错误日志
  }));
}

app.use(express.json()); // 解析JSON请求体
app.use(express.urlencoded({ extended: true })); // 解析URL编码请求体

// 静态文件
app.use('/static', express.static(path.join(__dirname, 'public')));

// 使用路由
app.use(routes);

// 404处理
app.use(notFoundHandler);

// 错误处理
app.use(errorHandler);

// 启动服务器
const startServer = async () => {
  try {
    // 测试数据库连接
    await testConnection();
    
    // 同步数据库模型（开发环境下使用force: true会删除并重建表，生产环境不要使用）
    if (config.server.env === 'development') {
      await syncDatabase(false); // 设置为true会删除并重建所有表
    }

    // 启动服务器
    app.listen(PORT, () => {
      // 移除调试日志输出
      
      // 添加路由调试信息
      console.log('===== 已注册的路由 =====');
      function printRoutes(stack, basePath = '') {
        stack.forEach(layer => {
          if (layer.route) {
            const methods = Object.keys(layer.route.methods)
              .filter(method => layer.route.methods[method])
              .join(',').toUpperCase();
            console.log(`${methods.padEnd(10)} ${basePath}${layer.route.path}`);
          } else if (layer.name === 'router' && layer.handle.stack) {
            // Express路由器中间件
            const path = layer.regexp.toString()
              .replace('\\/?(?=\\/|$)', '')
              .replace('\\/', '/')
              .replace('(?=\\/|$)', '')
              .replace(/^\/\^/, '')
              .replace(/\/i$/, '');
            printRoutes(layer.handle.stack, path);
          }
        });
      }
      
      try {
        printRoutes(app._router.stack);
      } catch (e) {
        console.log('打印路由出错:', e.message);
      }
      console.log('======================');
    });
  } catch (error) {
    console.error('启动服务器失败:', error);
    process.exit(1);
  }
};

// 启动服务器
startServer();

// 处理未捕获的异常
process.on('uncaughtException', (error) => {
  console.error('未捕获的异常:', error);
  process.exit(1);
});

// 处理未捕获的Promise拒绝
process.on('unhandledRejection', (reason, promise) => {
  console.error('未处理的Promise拒绝:', reason);
}); 